﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System.Data;

namespace Punto_de_Venta
{
   public class Operaciones
    {
        //declaracion e inicializacion de Variables globales
        static MySqlConnection conexion = new MySqlConnection();        //conexion
        static String cadenaConexion = "Server=localhost;" + "Database=punto_de_venta;" + "UID=root;" + "Password=;";    //cadena utilizada para crear la conexion a la base de datos
        static MySqlDataAdapter adaptador;
        static String[] datosUsuario = new String[3];   //arreglo utilizado para almacenar los datos del usuario que inicio session
        static double efectivoDisponible = 0;           //variable utilizada para mantener el efectivo
       static double cantidadInicial=0;                 //variable utilizada para mantener la cantidad inicial en caja

        //metodo utilizado para asignar los valores de la sesion actual que seran utilizados en nuestro sistema
        //en la posicion [0] el nombre, en la [1] el id y en la [2] el nivel del usuario
        public static void SetDatosUsuario(String nombre, int id, int nivel)
        {
            datosUsuario[0] = nombre;     //asignamos el nombre a la posicion 0 del arreglo para los datos
            datosUsuario[1] = id.ToString();    //asignamos el id del usuario a la posicion 1
            datosUsuario[2] = nivel.ToString(); //asinamos el nivel del usuario a la posicion 2
        }

        //metodo utilizado para obtener los datos del usuario una vez que ah iniciado en el sistema
        //regresa un arreglo de tipo String con los datos del usuario en sesion
        public static String[] GetDatosUsuario()
        {
            return datosUsuario;
        }

        //metodo utilizado para agregar efectivo a la caja, 
        //recibe la cantidad del efectivo a introducir
        public static void SetEfectivo(double efectivo)
        {
            efectivoDisponible = efectivo;  //asignamos el efectivo
            cantidadInicial = efectivo;     //asignamos la cantidad inicial en caja
        }

        //metodo utilizado para sumar mas efectivo a la caja despues de ralizar una venta
        public static void SumarEfectivo(double efectivoSumar)
        {
            efectivoDisponible += efectivoSumar;
        }

       public static void ReiniciarEfectivo(){
           efectivoDisponible = 0;
           cantidadInicial = 0;
       }

       //resta el efectivoo despues de realizar un corte
        public static void RestarEfectivo(double efectivo)
        {
            efectivoDisponible -= efectivo;
            cantidadInicial = efectivoDisponible;
        }

        //metodo utilizado para obtener el efectivo disponible
        //regresa un double con la canitad de efectivo con la que cuenta la caja
        public static double GetEfectivo()
        {
            return efectivoDisponible;  //regresamos el efectivo disponible en caja
        }

       //regresa la cantidad inicial en caja
        public static double getCantidadInicial() {
            return cantidadInicial;
        }

        //este metodo se utiliza para crear la conecion a nuestra base de datos
        public void Conectar()
        {
            try
            {
                conexion.ConnectionString = cadenaConexion;
                conexion.Open();
            }
            catch
            {
            }
        }

        /*Metodo utilizado para las consultas de tipo INSERT, UPDATE y DELETE.
         *retorna true si se realizo la operacion con exito y false si ocurrio alguna excepcion
         *recibe como parametro una cadena con la consulta que se realizara a la base dadatos
         */
        public Boolean Sql(string consulta)
        {
            try
            {

                Conectar();     //abrimos la conexion
                MySqlCommand comandoSql = new MySqlCommand(); //MySqlCommand nos servira para hacer consultas del tipo Insert, Update, Delete
                comandoSql.CommandText = consulta;   //mandamos la consulta
                comandoSql.Connection = conexion;    //mandamos la conexion
                comandoSql.ExecuteNonQuery();       //executamos la consulta
                Desconectar();                         //desonectamos de la base de datos
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);          //mostramos el error generado
                return false;
            }
            return true;
        }

        //Metodo utilizado para las consultas de tipo SELECT
        //Retorna una tabla con los resultados obtenidos en nuestra consulta
        public DataTable SqlSelect(String campos, String tabla, String condiciones)
        {
            String consulta = "select " + campos + " from " + tabla + " " + condiciones;   //creamos la consulta que se hara a la base de datos
            DataTable resultado = null;     //declaramos la tabla en la que almacenaremos el resultado de la consulta
            try
            {
                Conectar();     //conectamos con la base de datos
                DataSet res = new DataSet();  //creamos el dataset que sera el resultado de la base de datos
                adaptador = new MySqlDataAdapter(consulta, conexion);       //enviamos la consulta y la conexion 
                adaptador.Fill(res, tabla);     //se le manda el nombre de la tabla y el DataSet para que sea llenado con el resultado de la consulta
                resultado = res.Tables[0];      //se extrae la primera tabla del DataSet
                Desconectar();      //desconectamos la base de datos
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);    //mostramos un messagebox con el error generado
                return null;
            }
            return resultado;
        }

        //metodo que se utiliza para obtener el estado de la conexion
        //regresa true si la conexion esta activa(open) y false si esta inactiva(close)
        public Boolean EstadoConexion()
        {
            if (conexion.State.ToString() != "Open")
            {        //verificamos si la conexion con la base de datos esta abierta
                return false;
            }
            return true;
        }

        //metodo utilizado para cerrar nuestra conexion con la base de datos
        public void Desconectar()
        {
            try
            {
                conexion.Close();       //cierra la conexion con la base de datos
            }
            catch
            {

            }
        }

        /*Metodo utilizado para cerrar la aplicacion
         *es del tipo static para que sea utilizado sin la necesidad de usar un objeto de la clase
         *para utilizar este metodo solo se requerira poner Operaciones.CerrarAplicacion();
         */
        public static void CerrarAplicacion()
        {
            Application.Exit();     //cierra el programa
        }

        public static string MessageBoxx(string descripcion, string titulo)
        {
            messageBox MessageBox = new messageBox();
            MessageBox.Text = titulo;
            MessageBox.lblInformacion.Text = descripcion;
            DialogResult resul = new DialogResult();
            resul = MessageBox.ShowDialog();
            if (resul == DialogResult.Yes)
            {
                return resul.ToString();
            }
            else
            {
                return resul.ToString();
            }
        }
    }
}
